package cn.com.review;

public class ReviewOOP {
    public static void main(String[] args) {
        new Cat();//触发无参构造：Cat c = new Cat();
     Cat c = new Cat("小白",3,20);//触发有参；第二次加载，静态代码块不执行，构造代码块执行

        DD d =new DD();//子类对象
        d.eat();
        System.out.println(d.price);
       // d.play(); //子类不可调用父类私有资源
        /**多态对象与子类对象的使用效果相同。*/
//        Cat   c2 = new DD();//这里依然触发的是子类的无参构造和重写父类方法。
//        c2.eat();
    }

}
class  Cat{
    String name;
    int age;
    double price;
    static {

        System.out.println("我是静态代码块");
    }
    {
        System.out.println("我是构造代码块");
    }

    public Cat() {//无参构造
        this("叮当",5,30);//this必须第一行，不能自己调自己;this作用：这里优先调用全参构造方法
        System.out.println("我是父类的无参构造");
    }

    public Cat(String name, int age, double price) {//全参
        this.name = name;//this调用成员属性
        this.age = age;
        this.price = price;
        System.out.println("我是父类的全参构造");
    }

    //父类定义普通方法
    public void eat(){
        System.out.println("父类的吃饭方法");
        {
            System.out.println("父类的局部代码块");
        }
    }
    //父类私有方法
    private void play(){
        System.out.println("父类私有方法");
    }

}
//创建子类
class DD extends Cat{
    //子类成员变量
    String name ;
    //子类无参构造
    public  DD(){
        super();//系统默认存在super（）；自动调用父类的无参构造。对外不显示，需手动添加才显示
        System.out.println("子类无参构造");
    }

    @Override //重写父类方法
    public void eat() {
        super.eat();//调用父类原有方法。
        System.out.println(super.name);//叮当
        System.out.println("子类的吃法");//修改父类方法的功能
    }
    //子类特有方法
    public void jump(){
        System.out.println("叮当猫跳的高");
    }
}